package com.base.social.auth;

import com.base.core.enums.SystemCodeEnum;
import com.base.core.utils.R;
import com.base.social.domain.AuthCallbackParams;
import com.base.social.domain.AuthToken;
import com.base.social.domain.AuthUser;
import com.base.social.exception.AuthRuntimeException;

public interface Auth {

    /**
     * 返回带{@code state}参数的授权url，授权回调时会带上这个{@code state}
     *
     * @param state state 验证授权流程的参数，可以防止csrf
     * @return 返回授权地址
     */
    default String authorize(String state) {
        throw new AuthRuntimeException(SystemCodeEnum.NOT_IMPLEMENTED);
    }

    /**
     * 第三方登录
     *
     * @param authCallback 用于接收回调参数的实体
     * @return 返回登录成功后的用户信息
     */
    default R login(AuthCallbackParams authCallback) {
        throw new AuthRuntimeException(SystemCodeEnum.NOT_IMPLEMENTED);
    }

    /**
     * 获得token
     *
     * @param authCallback 用于接收回调参数的实体
     * @return 返回登录成功后的用户信息
     */
    default R oauthGetToken(AuthCallbackParams authCallback) {
        throw new AuthRuntimeException(SystemCodeEnum.NOT_IMPLEMENTED);
    }

    /**
     * 使用token换取用户信息
     *
     * @param authToken token信息
     * @return 用户信息
     * @see AuthDefault#createAccessToken(AuthCallbackParams)
     */
    default AuthUser findUserInfo(AuthToken authToken) {
        throw new AuthRuntimeException(SystemCodeEnum.NOT_IMPLEMENTED);
    }

    /**
     * 撤销授权
     *
     * @param authToken 登录成功后返回的Token信息
     * @return R
     */
    default R revoke(AuthToken authToken) {
        throw new AuthRuntimeException(SystemCodeEnum.NOT_IMPLEMENTED);
    }

    /**
     * 刷新access token （续期）
     *
     * @param authToken 登录成功后返回的Token信息
     * @return R
     */
    default R refresh(AuthToken authToken) {
        throw new AuthRuntimeException(SystemCodeEnum.NOT_IMPLEMENTED);
    }
}
